package work.mediway.common.configure;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 跨域访问控制
 * 做前后分离的话，这个也是必配的
 * 使用 CorsRegistry 注册表，配置每个接口
 * 增加 CorsRegistry 相关的配置
 *
 * @author zhongyj <1126834403@qq.com><br/>
 * @date 2019/11/18
 */
@Configuration
public class CorsConfig implements WebMvcConfigurer {

    /*在前端使用符合 CORS 规范的网络库时，例如说 Vue 常用的网络库 axios ，
    在发起非简单请求时，会自动先先发起 OPTIONS “预检”请求，要求服务器确认是否能够这样请求。这样，这个请求就会被 SpringMVC 的拦截器所处理。

此时，如果我们的拦截器认为 handler 一定是 HandlerMethod 类型时，就会导致报错。
例如说，在 UserSecurityInterceptor 拦截器中，会认为 handler 是 HandlerMethod 类型，
然后通过它获得 @RequiresLogin 注解信息，判断是否需要登录。然后，实际上，此时 handler 是 PreFlightHandler 类型，则会导致抛出异常。*/

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 全局配置允许所有URL
                .allowedOrigins("*")    // 允许所有请求来源
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true) // 允许发送Cookie
                .maxAge(3600)
                .allowedHeaders("*");
    }
}
